/**
 * 数据操作文件模块   车间
 * 职责：进行文件中的数据处理，只做数据处理，不关心业务
 * 该处才是咱们程序员主要负责的部分
 * 在该模块中设计不同业务处理方法
 * 只作为被业务调用
 * 这些方法需要被暴露出来
 */
var fs = require('fs')
var dbPath = './db.json'
/**
 * 获取所有学生列表
 * 设置成具有回调函数的方法
 * ajax  jquery
 * 回调的意义：在操作处，将各种情况都处理，在调用出进行判断处理
 * callback 两个参数
 * 		第一个参数：err
 * 				成功  null
 * 				错误  错误信息
 * 		第二个参数  data
 * 				成功  data数据
 * 				错误  undefined
 */
exports.find = function(callback){
	//异步方法
	fs.readFile(dbPath,'utf-8',function(err,data){
		if(err){
			return callback
		}
		callback(null,JSON.parse(data).students)//数组
	})
}

/**
 * 根据id获取学生的所有信息
 * @param {Number} id   学生id
 * @param {function} callback    回调函数
 */
exports.findById = function(id,callback){
	fs.readFile(dbPath,'utf-8',function(err,data){
		if(err){
			return callback(err)
		}
		var students = JSON.parse(data).students
		var ret = students.find(function(item){
			return item.id === parseInt(id)
		})
		callback(null,ret)
	})
}


/**
 * 添加学生
 * @param {Object} student  学生信息
 * @param {Object} callback  回调函数
 */
exports.save = function(student,callback){
	fs.readFile(dbPath,'utf-8',function(err,data){
		if(err){
			return callback(err)
		}
		var students = JSON.parse(data).students
		//添加id   0  1  2           3    4 
		student.id = students[students.length - 1].id +1
		//保存对象到数组
		students.push(student)
		//把对象数据转换成字符串形式
		var fileData = JSON.stringify({
			students
		})
		//将fileData写入到db.json中
		fs.writeFile(dbPath,fileData,function(err){
			if(err){
				return callback
			}
			callback(null)//成功  err为null
		})
	})
}

/**
 * 修改学生
 */
exports.updateById = function (student, callback) {
	fs.readFile(dbPath, 'utf-8', function (err, data) {
		if (err) {
			return callback(err)
		}
		//拿到学生数组信息
		var students = JSON.parse(data).students
		//find:es6操作数组的方法,通过ID来判断，用来查询满足条件的一条数据
		var stu = students.find(function (item) {
			return item.id == parseInt(student.id)
		})
		//将传来的对象中的数据拷贝到db.json的students中对应的对象中去
		//{ id: 1, name: '赵雷', zi: '子凤', age: '35', gender: 1, like: '骑马' }
		//{"id":1,"name":"赵雷","zi":"子凤","age":"35","gender":1,"like":"骑马"}
		for (var key in student) {
			stu[key] = student[key]
		}
		//把对象数据转换成字符串形式
		var fileData = JSON.stringify({
			students
		})
		//将fileData写入到db.json中
		fs.writeFile(dbPath, fileData, function (err) {
			if (err) {
				return callback(err)
			}
			callback(null)//成功  err为null
		})
	})
}

/**
 * 删除学生
 */

exports.deleteById = function (id, callback) {
	fs.readFile(dbPath, 'utf8', function (err, data) {
		if (err) {
			return callback(err)
		}
		var students = JSON.parse(data).students

		// findIndex 方法专门用来根据条件查找元素的下标
		var deleteId = students.findIndex(function (item) {
			return item.id === parseInt(id)
		})

		// 根据下标从数组中删除对应的学生对象
		students.splice(deleteId, 1)

		// 把对象数据转换为字符串
		var fileData = JSON.stringify({
			students: students
		})

		// 把字符串保存到文件中
		fs.writeFile(dbPath, fileData, function (err) {
			if (err) {
				// 错误就是把错误对象传递给它
				return callback(err)
			}
			// 成功就没错，所以错误对象是 null
			callback(null)
		})
	})
}


